package com.nlp.visualization.service.impl.backend;

import com.nlp.visualization.service.IJWTService;
import io.jsonwebtoken.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * @author LXM
 * @Title: NLPVisualizationTools
 * @Description:
 * @date 2018/5/11下午10:04
 */
@Service
public class JWTServiceImpl implements IJWTService {


    //密钥
    private static final String SECRET_KEY = "19951014";

    Logger logger = LoggerFactory.getLogger(JWTServiceImpl.class);

    /**
     * 获取一个token
     *
     * @param exp
     * @return
     */
    @Override
    public String buildJwt(Date exp) {
//        JwtBuilder builder = Jwts.builder()
//                .setId(id)                                      // JWT_ID
//                .setAudience("")                                // 接受者
//                .setClaims(null)                                // 自定义属性
//                .setSubject("")                                 // 主题
//                .setIssuer("")                                  // 签发者
//                .setIssuedAt(new Date())                        // 签发时间
//                .setNotBefore(new Date())                       // 失效时间
//                .setExpiration(long)                                // 过期时间
//                .signWith(signatureAlgorithm, secretKey);           // 签名算法以及密匙

        String jwt = Jwts.builder()
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)//SECRET_KEY是加密算法对应的密钥，这里使用额是HS256加密算法
                .setExpiration(exp)//expTime是过期时间
                .claim("role", "admin")//该方法是在JWT中加入值为vaule的key字段
                .compact();
        return jwt;
    }

    /**
     * 验证token是否有效
     *
     * @param jwt
     * @return
     */
    @Override
    public boolean isJwtValid(String jwt, String role) {
        try {
            //解析JWT字符串中的数据，并进行最基础的验证
            Claims claims = Jwts.parser()
                    .setSigningKey(SECRET_KEY)//SECRET_KEY是加密算法对应的密钥，jjwt可以自动判断机密算法
                    .parseClaimsJws(jwt)//jwt是JWT字符串
                    .getBody();
            String vaule = claims.get("key", String.class);//获取自定义字段key
            //判断自定义字段是否正确
            if (role.equals(vaule)) {
                return true;
            } else {
                return false;
            }
        }
        //在解析JWT字符串时，如果密钥不正确，将会解析失败，抛出SignatureException异常，说明该JWT字符串是伪造的
        //在解析JWT字符串时，如果‘过期时间字段’已经早于当前时间，将会抛出ExpiredJwtException异常，说明本次请求已经失效
        catch (SignatureException | ExpiredJwtException e) {
            return false;
        }
    }
}
